"""
将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

角色：
    目标接口（Target）
    待适配的类（Adaptee）
    适配器（Adapter）

两种实现方式：
    - 类适配器：使用多继承
    - 对象适配器：使用组合

其实就是：
    1、当支付宝支付接口想和微信支付接口一样使用pay()配调用，但是支付宝支付的是cost()方法(调用就会报错)。要想一样的被调用只有使用适配器。
        类适配器（使用多继承的方式，主要是继承抽象类方法，然后必须实现pay()方法，改写pay()方法。在pay()方法中调用cost()方法）
            class NewAlipay(Payment, Alipay):  # 适配器（Adapter）
            def pay(self, money):
                self.cost(money)
        对象适配器（通过对象组合，并继承抽象类，实现pay()方法。通过init中的不同对象，在pay()中做判断调用不同的方法）
            class PaymentAdapter(Payment):
            def __init__(self, payment):
                self.payment = payment  # 对象组合方式

            def pay(self, money):
                try:
                    self.payment.cost(money)
                except:
                    self.payment.pay(money)
"""
# 抽象产品角色（Product）
from abc import ABCMeta, abstractmethod


class Payment(metaclass=ABCMeta):  # 目标接口（Target）
    @abstractmethod
    def pay(self, money):
        pass


class WechatPay(Payment):
    """微信支付"""

    def pay(self, money):
        print("微信支付%d" % money)


class Alipay:  # 待适配的类（Adaptee）
    """支付宝支付"""

    def cost(self, money):
        print("支付宝支付%d" % money)


# 类适配器（Adapter）
# class NewAlipay(Payment, Alipay):
#     """类适配器：使用多继承"""
#
#     def pay(self, money):
#         self.cost(money)
#
#
# new_alipay = NewAlipay()
# new_alipay.pay(100)


# 对象适配器
class PaymentAdapter(Payment):
    def __init__(self, payment):
        self.payment = payment  # 对象组合方式

    def pay(self, money):
        """可以使用判断，适配多个方法"""
        try:
            self.payment.cost(money)
        except:
            self.payment.pay(money)


payment_adapter = PaymentAdapter(Alipay())
payment_adapter.pay(100)
